﻿ #define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

//数组指针
//类比其他指针
//int main()
//{
//	int a = 0;
//	int* pa = &a;//整形指针
//
//	char ch = 'w';
//	char* pc = &ch;//字符指针
//
//	int arr[10];
//	int (*p)[10] = &arr;//数组指针变量 不同于arr是数组首元素地址
//	//p先和*结合 （*p），说明p是⼀个指针变量变量，然后指着指向的是⼀个⼤⼩为10个整型的数组。
//	// 所以p是⼀个指针，指向⼀个数组，叫 数组指针
//
//	int* p1[10];//p1是指针数组 - 存放指针的数组
//	int (*p2)[10];//p2是指针变量，指向的是数组 --- 数组指针
//	
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//
//	int* p1 = arr;
//	//int*
//	printf("%p\n", p1);
//	printf("%p\n", p1 + 1);
//
//	int (*p2)[10] = &arr;
//	//int (*)[10] //去掉名字剩下的是类型：数组指针
//	printf("%p\n", p2);//&arr
//	printf("%p\n", p2 + 1);//&arr + 1
//
//	return 0;
//}



////void print(int arr[3][5], int r, int c)
//void print(int(*arr)[5], int r, int c)
//{
//	for (int i = 0; i < r; i++)
//	{
//		for (int j = 0; j < c; j++)
//		{
//			printf("%d ", *(*(arr + i) + j));//arr[i][j]
//		}
//		printf("\n");
//	}
//}
//
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6}, {3,4,5,6,7} };
//
//	print(arr, 3, 5);
//	//数组名是数组首元素的地址
//	//二维数组的首元素就是第一行
//	//首元素地址是第一行地址 第一行的地址是一维数组的地址 类型是数组指针
//
//	return 0;
//}

//函数指针
//int add(int x, int y)
//{
//	return x + y;
//}
//
//char* test(char c, int n)
//{
//	//**
//}
//
//int main()
//{
//	printf("%p\n", add);
//	printf("%p\n", &add);
//	//两个结果相同 故函数名是函数的地址
//
//	//函数指针的定义
//	int(*p1)(int, int) = &add;
//	//int(*)(int, int)//去掉变量名就是类型
//
//	char* (*p2)(char, int) = &test;
//
//	return 0;
//}

//int add(int x, int y)
//{
//	return x + y;
//}
//
//int main()
//{
//	int(*p)(int, int) = &add;
//
//	int c = add(1, 2);//函数和名调用
//	printf("%d\n", c);
//
//	int d = (*p)(3, 4);//函数指针调用 （）和* 无关紧要
//	printf("%d\n", d);
//
//	int e = p(5, 6);//函数指针调用
//	printf("%d\n", e);
//
//	return 0;
//}


//int main()
//{
//	( * ( void (*)() ) 0 )();//解释一下这段代码
//	//void (*)()-- 函数指针类型
//	//( void (*)() ) --		强制类型转换
//	//( void (*)() ) 0 -- 将0强制类型转换为void (*)()的函数指针类型
//	//这就意味着我们假设0 地址处放着无参，返回类型是void的函数
//	//最终是调用0地址处放的这个函数
//	//
//
//	//;
//	//0 -- int
//	//0x0012ff40   0
//
//	return 0;
//}

////类型重定义  typedef
//
//typedef unsigned int u_nit;
//
//typedef int* ppin_t;
//
//typedef int(*parr_t)[5];//数组指针类型重定义
////tupedef int(*)[5] parr_t;//err
//
//typedef void(*pf_t)(char);//函数指针类型重定义


//int add(int x, int y)
//{
//	return x + y;
//}
//
//int sub(int x, int y)
//{
//	return x - y;
//}
//
//int mul(int x, int y)
//{
//	return x * y;
//}
//
//int div(int x, int y)
//{
//	return x / y;
//}
//
//int main()
//{
//	int (*pf1)(int, int) = add;//pf1是函数指针变量
//	int(*pfarr[])(int, int) = { add,sub,mul,div };//pfarr是函数指针数组
//
//	for (int i = 0; i < 4; i++)
//	{
//		int r = pfarr[i](6, 6);
//		printf("%d\n", r);
//	}
//	
//	return 0;
//}

